/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.ces4.produccion.client.materiaprima;

import co.com.ces4.client.baseView.CreateBase;
import co.com.ces4.produccion.client.MateriaPrimaService;
import co.com.ces4.produccion.client.MateriaPrimaServiceAsync;
import co.com.ces4.produccion.client.utils.Loader;
import co.com.ces4.produccion.jpa.entities.MateriaPrima;
import co.com.ces4.produccion.jpa.entities.MateriaPrimaArticulo;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.util.BooleanCallback;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Button;
import com.smartgwt.client.widgets.Dialog;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.IntegerItem;
import com.smartgwt.client.widgets.form.fields.RadioGroupItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.Layout;
import com.smartgwt.client.widgets.layout.SectionStackSection;
import java.util.ArrayList;
import java.util.LinkedHashMap;

/**
 *
 * @author usuario
 */
public class EdicionMateriaPrima extends CreateBase {

    private TextItem txtDescripcionMatPrima, txtUnidadMedidaMatPrima;
    private IntegerItem txtPrecioMatPrima;
    private RadioGroupItem matPrimaStatusRg;
    private DynamicForm frmAdministracionMatPrima;
    private Button btnGuardar, btnLimpiar;
    private SectionStackSection stsAdministracionMatPrima;
    private HLayout hlyAccionesAdministracionMatPrima;
    private MateriaPrima materiaPrima;

    public EdicionMateriaPrima() {
        super("Materia Prima", "100%");
        stsAdministracionMatPrima = new SectionStackSection();
        stsAdministracionMatPrima.setShowHeader(false);
        stsAdministracionMatPrima.setCanCollapse(false);
        stsAdministracionMatPrima.setExpanded(true);

        frmAdministracionMatPrima = new DynamicForm();
        frmAdministracionMatPrima.setWidth100();
        frmAdministracionMatPrima.setNumCols(4);

        txtDescripcionMatPrima = new TextItem("txtDescripcionMatPrima", "Descripción");
        txtDescripcionMatPrima.setRequired(true);
        txtDescripcionMatPrima.setLength(50);

        txtPrecioMatPrima = new IntegerItem("txtPrecioMatPrima", "Precio");
        txtPrecioMatPrima.setRequired(true);

        txtUnidadMedidaMatPrima = new TextItem("txtUnidadMedidaMatPrima", "Unidad de Medida");
        txtUnidadMedidaMatPrima.setRequired(true);
        txtUnidadMedidaMatPrima.setLength(30);

        matPrimaStatusRg = new RadioGroupItem("matPrimaStatus", "Estado");
        matPrimaStatusRg.setVertical(false);
        matPrimaStatusRg.setRequired(true);
        LinkedHashMap<String, String> statusOption = new LinkedHashMap<String, String>();
        statusOption.put("a", "Activo");
        statusOption.put("i", "Inactivo");
        matPrimaStatusRg.setValueMap(statusOption);

        btnGuardar = new Button("Guardar");
        btnGuardar.addClickHandler(new ClickHandler() {

            public void onClick(ClickEvent event) {
                guardarArticulo();
            }
        });
        btnLimpiar = new Button("Limpiar");
        btnLimpiar.addClickHandler(new ClickHandler() {

            public void onClick(ClickEvent event) {
                frmAdministracionMatPrima.clearValues();
            }
        });

        hlyAccionesAdministracionMatPrima = new HLayout();
        hlyAccionesAdministracionMatPrima.setMargin(15);
        hlyAccionesAdministracionMatPrima.setAlign(Alignment.CENTER);
        hlyAccionesAdministracionMatPrima.addMember(btnGuardar);
        hlyAccionesAdministracionMatPrima.addMember(btnLimpiar);
        hlyAccionesAdministracionMatPrima.setMembersMargin(15);
        setSectionContainerItems(hlyAccionesAdministracionMatPrima);

        frmAdministracionMatPrima.setItems(txtDescripcionMatPrima, txtPrecioMatPrima, txtUnidadMedidaMatPrima, matPrimaStatusRg);
        stsAdministracionMatPrima.addItem(frmAdministracionMatPrima);
        addSection(stsAdministracionMatPrima);
    }

    public EdicionMateriaPrima(final MateriaPrima materiaPrima) {
        this();
        this.materiaPrima = materiaPrima;
        setSectionTitle(0, "Editar Materia Prima");
        txtDescripcionMatPrima.setValue(materiaPrima.getDsdescripcion());
        txtPrecioMatPrima.setValue(materiaPrima.getNmprecio());
        txtUnidadMedidaMatPrima.setValue(materiaPrima.getDsunidadMedida());
        btnLimpiar.setDisabled(true);
        if (materiaPrima.getSnestado()) {
            matPrimaStatusRg.setValue("a");
        } else {
            matPrimaStatusRg.setValue("i");
        }
    }

    private void guardarArticulo() {
        if (frmAdministracionMatPrima.validate()) {
            if (materiaPrima == null) {
                Loader.showLoader();
                final MateriaPrima tmp = getMateriaPrima();
                AsyncCallback<Void> registrarCallback = new AsyncCallback<Void>() {

                    @Override
                    public void onFailure(Throwable caught) {
                        SC.warn("Error", caught.getMessage(), new BooleanCallback() {

                            @Override
                            public void execute(Boolean value) {
                            }
                        }, new Dialog());
                        materiaPrima = null;
                        Loader.hideLoader();
                    }

                    @Override
                    public void onSuccess(Void result) {
                        materiaPrima = tmp;
                        btnLimpiar.setDisabled(true);
                        SC.say("Señor usuario, el registro fue guardado correctamente");
                        final ConsultaMateriaPrima ca = new ConsultaMateriaPrima();
                        EdicionMateriaPrima.this.hide();
                        ca.setLayoutData("Consultar Materias Primas");
                        ((Layout) EdicionMateriaPrima.this.getParentElement()).addMember(ca);
                        Loader.hideLoader();
                    }
                };
                getMateriaPrimaService().guardarMateriaPrima(tmp, registrarCallback);
            } else {
                final MateriaPrima tmp = getMateriaPrima();
                AsyncCallback<Void> actualizarCallback = new AsyncCallback<Void>() {

                    @Override
                    public void onFailure(Throwable caught) {
                        SC.warn("Error", caught.getMessage(), new BooleanCallback() {

                            @Override
                            public void execute(Boolean value) {
                            }
                        }, new Dialog());
                        Loader.hideLoader();
                    }

                    @Override
                    public void onSuccess(Void result) {
                        materiaPrima = tmp;
                        SC.say("Señor usuario, el registro fue actualizado correctamente");
                        final ConsultaMateriaPrima ca = new ConsultaMateriaPrima();
                        EdicionMateriaPrima.this.hide();
                        ca.setLayoutData("Consultar Materias Primas");
                        ((Layout) EdicionMateriaPrima.this.getParentElement()).addMember(ca);
                        Loader.hideLoader();
                    }
                };
                getMateriaPrimaService().actualizarMateriaPrima(tmp, actualizarCallback);
            }
        }
    }

    private MateriaPrima getMateriaPrima() {
        if (materiaPrima == null) {
            materiaPrima = new MateriaPrima();
            materiaPrima.setMateriaPrimaArticuloList(new ArrayList<MateriaPrimaArticulo>());
        }

        materiaPrima.setDsdescripcion(txtDescripcionMatPrima.getValueAsString());

        if (txtPrecioMatPrima.getValueAsString() != null) {
            materiaPrima.setNmprecio(Double.valueOf(txtPrecioMatPrima.getValueAsString()));
        } else {
            materiaPrima.setNmprecio(0);
        }

        materiaPrima.setDsunidadMedida(txtUnidadMedidaMatPrima.getValueAsString());

        if (matPrimaStatusRg.getValueAsString().equals("a")) {
            materiaPrima.setSnestado(true);
        } else {
            materiaPrima.setSnestado(false);
        }

        return materiaPrima;
    }

    private MateriaPrimaServiceAsync getMateriaPrimaService() {
        return GWT.create(MateriaPrimaService.class);
    }
}
